package it.gestoreContratti.gui.panels;

import it.gestoreContratti.database.DatabaseController;
import it.gestoreContratti.entity.Specifica;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class VisualizzaTutteSpecifichePanel extends JPanel {

	

	
	private static final long serialVersionUID = 7208107919288364230L;
	private DateFormat dateFormat;

	private Vector<Specifica> specifiche;
	private JTextField visualizzazioneTextField;
	private JTable table;
	private JTextField ricercaTextField;
	private SpecificheTabelModel specificheTableModel;
	private JComboBox ricercaComboBox;
	
	public VisualizzaTutteSpecifichePanel(DatabaseController dbController, Vector<Specifica> spec) {		
		this.specifiche = spec;		
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{80, 105, 131, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
		gridBagLayout.columnWeights = new double[]{1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
		setLayout(gridBagLayout);
		
		//this.specifiche = specificheContratto;
		//this.databaseController = dbController;
		specificheTableModel = new SpecificheTabelModel(specifiche);		
		
		
		JLabel visualizzazioneLabel = new JLabel("Stai Visualizzando");
		GridBagConstraints gbc_visualizzazioneLabel = new GridBagConstraints();
		gbc_visualizzazioneLabel.anchor = GridBagConstraints.EAST;
		gbc_visualizzazioneLabel.insets = new Insets(0, 0, 5, 5);
		gbc_visualizzazioneLabel.gridx = 0;
		gbc_visualizzazioneLabel.gridy = 0;
		add(visualizzazioneLabel, gbc_visualizzazioneLabel);
		
		visualizzazioneTextField = new JTextField();		
		visualizzazioneTextField.setText("TUTTE LE SPECIFICHE");		
		visualizzazioneTextField.setEditable(false);
		GridBagConstraints gbc_visualizzazioneTextField = new GridBagConstraints();
		gbc_visualizzazioneTextField.gridwidth = 3;
		gbc_visualizzazioneTextField.insets = new Insets(0, 0, 5, 5);
		gbc_visualizzazioneTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_visualizzazioneTextField.gridx = 1;
		gbc_visualizzazioneTextField.gridy = 0;
		add(visualizzazioneTextField, gbc_visualizzazioneTextField);
		visualizzazioneTextField.setColumns(10);
		
		
		JScrollPane scrollPane = new JScrollPane();
		GridBagConstraints gbc_scrollPane = new GridBagConstraints();
		gbc_scrollPane.fill = GridBagConstraints.BOTH;
		gbc_scrollPane.gridwidth = 4;
		gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
		gbc_scrollPane.gridx = 0;
		gbc_scrollPane.gridy = 1;
		add(scrollPane, gbc_scrollPane);
		
		table = new JTable();
		table.setModel(specificheTableModel);
		scrollPane.setViewportView(table);
		
		JLabel ricercaLabel = new JLabel("Ricerca");
		GridBagConstraints gbc_ricercaLabel = new GridBagConstraints();
		gbc_ricercaLabel.anchor = GridBagConstraints.WEST;
		gbc_ricercaLabel.insets = new Insets(0, 0, 0, 5);
		gbc_ricercaLabel.gridx = 0;
		gbc_ricercaLabel.gridy = 2;
		add(ricercaLabel, gbc_ricercaLabel);
		
		ricercaComboBox = new JComboBox();
		ricercaComboBox.setModel(new DefaultComboBoxModel(RicercaSpecificaField.values()));
		GridBagConstraints gbc_ricercaComboBox = new GridBagConstraints();
		gbc_ricercaComboBox.insets = new Insets(0, 0, 0, 5);
		gbc_ricercaComboBox.fill = GridBagConstraints.HORIZONTAL;
		gbc_ricercaComboBox.gridx = 1;
		gbc_ricercaComboBox.gridy = 2;
		add(ricercaComboBox, gbc_ricercaComboBox);
		
		ricercaTextField = new JTextField();
		GridBagConstraints gbc_ricercaTextField = new GridBagConstraints();
		gbc_ricercaTextField.insets = new Insets(0, 0, 0, 5);
		gbc_ricercaTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_ricercaTextField.gridx = 2;
		gbc_ricercaTextField.gridy = 2;
		add(ricercaTextField, gbc_ricercaTextField);
		ricercaTextField.setColumns(10);
		
		JButton ricercaButton = new JButton("Ricerca");
		ricercaButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				RicercaSpecificaField selected = (RicercaSpecificaField) ricercaComboBox.getSelectedItem();
				try{
					switch (selected) {
					case NUMERO:
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 15){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 15 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal numeroSearch = new BigDecimal(ricercaTextField.getText());
							Vector<Specifica> find = new Vector<Specifica>();
							for(int i=0;i<specifiche.size();i++){
								if(specifiche.get(i).getNumero().compareTo(numeroSearch) == 0){
									find.add(specifiche.get(i));
								}
							}
							specificheTableModel.setDati(find);
							table.setModel(specificheTableModel);					
							table.validate();								
						}
						break;					
					case DATA_INIZIO:
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() != 10){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere una data nel formato GG/MM/AAAA", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{								
							Vector<Specifica> find = new Vector<Specifica>();
							for(int i=0;i<specifiche.size();i++){
								if(dateFormat.format(specifiche.get(i).getDataInizio()).equals(ricercaTextField.getText())){
									find.add(specifiche.get(i));
								}
							}
							specificheTableModel.setDati(find);
							table.setModel(specificheTableModel);					
							table.validate();								
						}
						break;
					case DATA_SCADENZA:							
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() != 10){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere una data nel formato GG/MM/AAAA", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{								
							Vector<Specifica> find = new Vector<Specifica>();
							for(int i=0;i<specifiche.size();i++){
								if(dateFormat.format(specifiche.get(i).getDataScadenza()).equals(ricercaTextField.getText())){
									find.add(specifiche.get(i));
								}
							}
							specificheTableModel.setDati(find);
							table.setModel(specificheTableModel);					
							table.validate();								
						}
						break;
					case TERMINE_CONSEGNA:
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 4){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 4 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal termineConsegnaSearch = new BigDecimal(ricercaTextField.getText());
							Vector<Specifica> find = new Vector<Specifica>();
							for(int i=0;i<specifiche.size();i++){
								if(specifiche.get(i).getTermineConsegna().compareTo(termineConsegnaSearch) == 0){
									find.add(specifiche.get(i));
								}
							}
							specificheTableModel.setDati(find);
							table.setModel(specificheTableModel);					
							table.validate();								
						}
						break;		
					case IMPORTO:							
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 15){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 15 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal importoSearch = new BigDecimal(ricercaTextField.getText());
							Vector<Specifica> find = new Vector<Specifica>();
							for(int i=0;i<specifiche.size();i++){
								if(specifiche.get(i).getImporto().compareTo(importoSearch) == 0){
									find.add(specifiche.get(i));
								}
							}
							specificheTableModel.setDati(find);
							table.setModel(specificheTableModel);					
							table.validate();								
						}
						break;
					case NUMERO_CONTRATTO:							
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 15){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 15 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal numeroContrattoSearch = new BigDecimal(ricercaTextField.getText());
							Vector<Specifica> find = new Vector<Specifica>();
							for(int i=0;i<specifiche.size();i++){
								if(specifiche.get(i).getNumeroContratto().compareTo(numeroContrattoSearch) == 0){
									find.add(specifiche.get(i));
								}
							}
							specificheTableModel.setDati(find);
							table.setModel(specificheTableModel);					
							table.validate();								
						}
						break;
					default:
						break;
					}
				}catch (NumberFormatException ex) {
					JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere un numero", "", JOptionPane.WARNING_MESSAGE);
					ricercaTextField.setText("");
					ricercaTextField.validate();
				}
			}
		});
		GridBagConstraints gbc_ricercaButton = new GridBagConstraints();
		gbc_ricercaButton.gridx = 3;
		gbc_ricercaButton.gridy = 2;
		add(ricercaButton, gbc_ricercaButton);

	}

}
